//--------------------------------------------------------------
//Descripcion : agrega los item seleccionados del padre(multiselect de la izquierda) a la hija(multiselect de la derecha)
//Por         : VSR, 01/01/2011
function wucmsAgregarItem(prefijoControl) {
  var wuc_lstPadre = document.getElementById(prefijoControl + "lstPadre");
  var wuc_lstHija = document.getElementById(prefijoControl + "lstHija");
  var wuc_chkTodosPadre = document.getElementById(prefijoControl + "chkTodosPadre");
  var wuc_holderCheckTodosPadre = document.getElementById(prefijoControl + "holderCheckTodosPadre");
  var wuc_chkTodosHija = document.getElementById(prefijoControl + "chkTodosHija");
  var wuc_holderCheckTodosHija = document.getElementById(prefijoControl + "holderCheckTodosHija");

  // usamos la funcion para trasparas los elementos seleccionado al lb de los seleccionados
  wucmsMoveOption(wuc_lstPadre, wuc_lstHija);
  //obtiene los item seleccionados
  wucmsObtenerIdSeleccionados(prefijoControl);
  //verifica si muestra el check todos
  wucmsMostrarCheckTodos(wuc_lstPadre, wuc_chkTodosPadre, wuc_holderCheckTodosPadre);
  wucmsMostrarCheckTodos(wuc_lstHija, wuc_chkTodosHija, wuc_holderCheckTodosHija);
  return false;
}

//--------------------------------------------------------------
//Descripcion : quita los item seleccionados de la hija(multiselect de la derecha) y los agrega al padre(multiselect de la izquierda)
//Por         : VSR, 01/01/2011
function wucmsQuitarItem(prefijoControl) {
  var wuc_lstPadre = document.getElementById(prefijoControl + "lstPadre");
  var wuc_lstHija = document.getElementById(prefijoControl + "lstHija");
  var wuc_chkTodosPadre = document.getElementById(prefijoControl + "chkTodosPadre");
  var wuc_holderCheckTodosPadre = document.getElementById(prefijoControl + "holderCheckTodosPadre");
  var wuc_chkTodosHija = document.getElementById(prefijoControl + "chkTodosHija");
  var wuc_holderCheckTodosHija = document.getElementById(prefijoControl + "holderCheckTodosHija");

  // usamos la funcion para trasparas los elementos seleccionado al lb de los seleccionados
  wucmsMoveOption(wuc_lstHija, wuc_lstPadre);
  //obtiene los item seleccionados
  wucmsObtenerIdSeleccionados(prefijoControl);
  //verifica si muestra el check todos
  wucmsMostrarCheckTodos(wuc_lstPadre, wuc_chkTodosPadre, wuc_holderCheckTodosPadre);
  wucmsMostrarCheckTodos(wuc_lstHija, wuc_chkTodosHija, wuc_holderCheckTodosHija);
  return false;
}

//--------------------------------------------------------------
//Descripcion : actualiza la lista de id de los item seleccionados
//Por         : VSR, 01/01/2011
function wucmsObtenerIdSeleccionados(prefijoControl) {
  var wuc_txtIdsHija = document.getElementById(prefijoControl + "txtIdsHija");
  var wuc_lstHija = document.getElementById(prefijoControl + "lstHija");
  var wuc_txtFuncionesEspeciales = document.getElementById(prefijoControl + "txtFuncionesEspeciales");

  var lista = "";
  wuc_txtIdsHija.value = "";
  //construye la lista separados por coma
  for (var i = 0; i < wuc_lstHija.length; i++) {
    id = wuc_lstHija.options[i].value;
    lista += (lista == "") ? id : "," + id;
  }
  //asigna valor
  wuc_txtIdsHija.value = lista;

  //invoca a funciones especiales
  if (wuc_txtFuncionesEspeciales.value != "") {
    eval(wuc_txtFuncionesEspeciales.value);
  }
}

//--------------------------------------------------------------
//Descripcion : verifica si se debe o no mostrar el check todos
//Por         : 01/01/2011
function wucmsMostrarCheckTodos(elemListBox, elemCheckTodos, elemHolderCheckTodos) {
  var objListBox = document.getElementById(elemListBox);
  var objCheckTodos = document.getElementById(elemCheckTodos);
  var objHolderCheckTodos = document.getElementById(elemHolderCheckTodos);

  if (objCheckTodos) {
    objCheckTodos.checked = false;
    objHolderCheckTodos.style.display = (objListBox.length == 0) ? "none" : "block";
  }
}

//--------------------------------------------------------------
//Descripcion : function para copiar elementos de un select a otro.
//              con mod para que no copie cuando el value del elemento a copiar ya existe en el select destino
//Por         : VSR, 01/01/2011
function wucmsMoveOption(objSourceElement, objTargetElement) {
  var aryTempSourceOptions = new Array();
  var aryTempTargetOptions = new Array();
  var x = 0;
  var existe = false;
  var objTempValues;

  //looping through source element to find selected options
  for (var i = 0; i < objSourceElement.length; i++) {
    if (objSourceElement.options[i].selected) {
      // revisamos que el value de este elemento no este en el target
      existe = false;
      for (var t = 0; t < objTargetElement.length; t++) {
        if (objTargetElement.options[t].value == objSourceElement.options[i].value) {
          // esto es para que no elimine el elemento seleccionado (pero no movido) del select origen
          objTempValues = new Object();
          objTempValues.text = objSourceElement.options[i].text;
          objTempValues.value = objSourceElement.options[i].value;
          aryTempSourceOptions[x] = objTempValues;
          x++;
          // decimos que el elemento ya existe
          existe = true;
          break;
        }
      }
      if (!existe) {
        //need to move this option to target element
        var intTargetLen = objTargetElement.length++;
        objTargetElement.options[intTargetLen].text = objSourceElement.options[i].text;
        objTargetElement.options[intTargetLen].value = objSourceElement.options[i].value;
      }
    }
    else {
      //storing options that stay to recreate select element
      objTempValues = new Object();
      objTempValues.text = objSourceElement.options[i].text;
      objTempValues.value = objSourceElement.options[i].value;
      aryTempSourceOptions[x] = objTempValues;
      x++;
    }
  }

  //sorting and refilling target list
  for (var i = 0; i < objTargetElement.length; i++) {
    objTempValues = new Object();
    objTempValues.text = objTargetElement.options[i].text;
    objTempValues.value = objTargetElement.options[i].value;
    aryTempTargetOptions[i] = objTempValues;
  }

  aryTempTargetOptions.sort(wucmsSortByText);

  for (var i = 0; i < objTargetElement.length; i++) {
    objTargetElement.options[i].text = aryTempTargetOptions[i].text;
    objTargetElement.options[i].value = aryTempTargetOptions[i].value;
    objTargetElement.options[i].selected = false;
  }

  //resetting length of source
  objSourceElement.length = aryTempSourceOptions.length;
  //looping through temp array to recreate source select element
  for (var i = 0; i < aryTempSourceOptions.length; i++) {
    objSourceElement.options[i].text = aryTempSourceOptions[i].text;
    objSourceElement.options[i].value = aryTempSourceOptions[i].value;
    objSourceElement.options[i].selected = false;
  }
}

//--------------------------------------------------------------
//Descripcion : orden los elementos
//Por         : VSR, 01/01/2011
function wucmsSortByText(a, b) {
  if (a.text < b.text) {return -1}
  if (a.text > b.text) {return 1}
  return 0;
}

//------------------------------------------------------------------
//Descripcion : marca o desmarca todos los item
//Por         : VSR, 01/01/2011
function wucmsSelectAll(nombreListBox, nombreCheckBox) {
  var objList = document.getElementById(nombreListBox);
  var objCheck = document.getElementById(nombreCheckBox);
  if (objList && objCheck) {
    for (var i = 0; i < objList.length; i++) {
      objList.options[i].selected = objCheck.checked;
    }
  }
  return false;
}

//------------------------------------------------------------------
//Descripcion : marca o desmarca todos los item
//Por         : VSR, 01/01/2011
function wucmsSelectAllConValorBooleano(nombreListBox, marcado) {
  var objList = document.getElementById(nombreListBox);
  if (objList) {
    for (var i = 0; i < objList.length; i++) {
      objList.options[i].selected = marcado;
    }
  }
  return false;
}

//------------------------------------------------------------------
//Descripcion : obtiene valores seleccionados
//Por         : VSR, 01/01/2011
function wucmsListadoIdSeleccionados(elemTxtIdsHija) {
  var wuc_txtIdsHija = document.getElementById(elemTxtIdsHija);
  return wuc_txtIdsHija.value;
}

//------------------------------------------------------------------
//Descripcion : filtra las opciones de un select
//Fuente      : http://www.martiniglesias.eu/blog/listbox-doble-con-filtro-de-busqueda-usando-jquery/47
//Por         : VSR, 16/04/2011
function wucmsFiltrar(prefijoControl, objList, filter) {
    jQuery("#"+ objList +" option").filter(function(i) {
        var toMatch = jQuery(this).text().toString().toLowerCase();
        var filterLower = filter.toString().toLowerCase();
        return toMatch.indexOf(filterLower) == -1;
    }).appendTo("#"+ prefijoControl +"wucmsStorage");

    jQuery("#"+ prefijoControl +"wucmsStorage option").filter(function(i) {
        var toMatch = jQuery(this).text().toString().toLowerCase();
        var filterLower = filter.toString().toLowerCase();
        return toMatch.indexOf(filterLower) != -1;
    }).appendTo("#"+ objList);
    wucmsOrdenarOpciones(objList);
}

function wucmsOrdenarOpciones(objList) {
    var $toSortOptions = jQuery("#"+ objList +" option");
    $toSortOptions.sort(function(a, b) {
        var aVal = a.text.toLowerCase();
        var bVal = b.text.toLowerCase();
        if (aVal < bVal) {return -1;}
        if (aVal > bVal) {return 1;}
        return 0;
    });
    jQuery("#" + objList).empty().append($toSortOptions);
}

function wucmsLimpiarFiltro(prefijoControl,objList, objTextFiltro) {
    jQuery("#"+ objTextFiltro).val("");
    wucmsFiltrar(prefijoControl,objList, "");
}
